package com.doubao.user.service;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.doubao.common.result.Result;
import com.doubao.user.dto.request.UserApiKeyRequest;
import com.doubao.user.entity.UserApiKey;

import java.util.List;

/**
 * 用户API密钥服务接口
 */
public interface UserApiKeyService {

    /**
     * 添加API密钥
     *
     * @param userId  用户ID
     * @param request API密钥请求
     * @return 添加结果
     */
    Result<Void> addApiKey(Long userId, UserApiKeyRequest request);

    /**
     * 更新API密钥
     *
     * @param keyId   API密钥ID
     * @param request API密钥请求
     * @return 更新结果
     */
    Result<Void> updateApiKey(Long keyId, UserApiKeyRequest request);

    /**
     * 删除API密钥
     *
     * @param keyId API密钥ID
     * @return 删除结果
     */
    Result<Void> deleteApiKey(Long keyId);

    /**
     * 获取用户API密钥列表
     *
     * @param userId 用户ID
     * @return API密钥列表
     */
    List<UserApiKey> getUserApiKeys(Long userId);

    /**
     * 分页获取用户API密钥列表
     *
     * @param userId 用户ID
     * @param page   页码
     * @param size   每页大小
     * @return API密钥分页列表
     */
    IPage<UserApiKey> getUserApiKeysPage(Long userId, int page, int size);

    /**
     * 获取API密钥详情
     *
     * @param keyId API密钥ID
     * @return API密钥详情
     */
    UserApiKey getApiKeyById(Long keyId);

    /**
     * 根据用户ID和提供商获取API密钥
     *
     * @param userId      用户ID
     * @param apiProvider API提供商
     * @return API密钥
     */
    UserApiKey getApiKeyByProvider(Long userId, String apiProvider);

    /**
     * 更新API密钥激活状态
     *
     * @param keyId    API密钥ID
     * @param isActive 是否激活
     * @return 更新结果
     */
    Result<Void> updateActiveStatus(Long keyId, Integer isActive);

    /**
     * 增加已用配额
     *
     * @param keyId API密钥ID
     * @param quota 配额数量
     * @return 增加结果
     */
    Result<Void> increaseQuotaUsed(Long keyId, Long quota);

    /**
     * 重置已用配额
     *
     * @param keyId API密钥ID
     * @return 重置结果
     */
    Result<Void> resetQuotaUsed(Long keyId);

    /**
     * 更新配额限制
     *
     * @param keyId      API密钥ID
     * @param quotaLimit 配额限制
     * @return 更新结果
     */
    Result<Void> updateQuotaLimit(Long keyId, Long quotaLimit);

    /**
     * 检查API密钥是否超出配额
     *
     * @param keyId API密钥ID
     * @return 是否超出配额
     */
    boolean isQuotaExceeded(Long keyId);

    /**
     * 验证API密钥是否有效
     *
     * @param apiProvider API提供商
     * @param apiKey      API密钥
     * @return 验证结果
     */
    Result<Boolean> validateApiKey(String apiProvider, String apiKey);
}